需要预先学习:


1. 能作为条件的表达式

在 C++ 中,条件就是放在 if、while 等控制结构里用来决定程序走向的表达式。条件表达式的类型是 bool 类型,值只能是 true(真)或 false(假)。

bool flag = true;           // flag 的值为 true
if (flag)                   // flag 是 bool 类型,直接作为条件
{
    // 条件成立时执行
}

1.1 关系表达式

关系表达式使用关系运算符比较两个值的大小或相等关系,结果是 bool 类型。

运算符 含义 示例 结果
> 大于 a > b a 大于 b 则为 true
< 小于 a < b a 小于 b 则为 true
>= 大于等于 a >= b a 大于等于 b 则为 true
<= 小于等于 a <= b a 小于等于 b 则为 true
== 等于 a == b a 等于 b 则为 true
!= 不等于 a != b a 不等于 b 则为 true
int a = 10;
int b = 20;

bool r1 = a > b;          // false
bool r2 = a < b;          // true
bool r3 = a == b;         // false
bool r4 = a != b;         // true

if (a < b)                // 条件为 true
{
    std::cout << "a 比 b 小";
}

注意:== 是比较"相等",= 是赋值,不要弄混。if (a = 10) 是赋值而非比较,在大多数编译器中会产生警告。


1.2 逻辑表达式

逻辑表达式使用逻辑运算符组合多个 bool 值,结果为 bool 类型。

运算符 含义 示例 结果
&& 逻辑与(AND) a && b 两者都为 true 时结果为 true
|| 逻辑或(OR) a || b 至少一个为 true 时结果为 true
! 逻辑非(NOT) !a a 取反,true 变 false
int age = 25;
bool hasTicket = true;

if (age >= 18 && hasTicket)         // 两个条件都满足
{
    std::cout << "可以入场";
}

if (age < 18 || !hasTicket)         // 未成年或没票
{
    std::cout << "不能入场";
}

短路求值

&& 和 || 具有短路特性——一旦能确定整个表达式的结果,就不再继续计算后面的部分。

&& 的短路:如果左侧为 false,整个结果必定为 false,右侧不再计算:

int x = 0;
if (false && ++x)                   // ++x 根本不会执行!
{
    // 不会进入这里
}
// x 仍然是 0

|| 的短路:如果左侧为 true,整个结果必定为 true,右侧不再计算:

int y = 0;
if (true || ++y)                    // ++y 根本不会执行!
{
    // 一定会进入这里
}
// y 仍然是 0

理解要点:&& 碰到 false 就停,|| 碰到 true 就停。利用短路可以安全地写出 if (ptr != nullptr && *ptr > 0) 这样的代码——指针为空时不会解引用。


1.3 非布尔类型作为条件

C++ 允许将非布尔类型(如 int、float、指针等)直接放在条件表达式中。此时,值会被隐式转换为 bool 类型,规则很简单:

原值 转换为
0(整数零) false
0.0(浮点零) false
nullptr / NULL(空指针) false
其他所有非零值 true
if (0)          // false,不执行
if (1)          // true,执行
if (-1)         // true,负数也是非零值!
if (3.14)       // true,非零浮点数

总结:为零就是 false,不为零就是 true。负数也不例外。


2. if 语句

if 语句根据条件选择是否执行某段代码。基本语法有两种形式:

形式一:执行单条语句

if (条件)
    单条语句;           // 条件为 true 时执行

形式二:执行代码块

if (条件)
{
    // 条件为 true 时执行这里的所有语句
}

个人建议都使用代码块形式(即使只有一条语句),更清晰、不易出错。


2.1 if-else 语句

if-else 提供了"条件为 false 时怎么办"的分支:

int score = 85;

if (score >= 60)
{
    std::cout << "及格";
}
else
{
    std::cout << "不及格";
}

else 总是与它前面最近的、尚未配对的 if 结合。


2.2 if-else if-else 结构

当需要处理多个条件分支时,可以在 else 后面接一个新的 if,形成链式判断:

int score = 85;

if (score >= 90)
{
    std::cout << "优秀";
}
else if (score >= 80)
{
    std::cout << "良好";
}
else if (score >= 60)
{
    std::cout << "及格";
}
else
{
    std::cout << "不及格";
}

2.3 程序从上到下依次检查每个条件,一旦某个条件为 true 就执行对应代码块,然后跳过整个 if-else if-else 结构。如果所有条件都不满足,执行最后的 else(如果有的话)。